package zhixin;

import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import zhixin.excel.entity.CityPos;

import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @program: demo01
 * @description: 浏览控制测试
 * @author: 致心
 * @create: 2020-08-28 09:59
 **/
public class webAuto {
    public static void main(String[] args) throws Exception {
        controlExistingBrowser();
//        controlExistingBrowser360_78();
    }

    /**
     * @Description 控制360浏览器 78版本，因为360浏览器使用的是谷歌的内核
     * 怎么查看自己360浏览器和控制版本的对应关系：安装后找到帮助-关于-查看内核版本
     * 这里命令先执行
     * 对于-remote-debugging-port值，可以指定任何打开的端口。
     * 而在 options.setExperimentalOption("debuggerAddress", "localhost:9222");端口一定要对上
     * 对于-user-data-dir标记，指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome，不会污染你的默认配置文件。
     * cd C:\Users\27451\AppData\Roaming\secoresdk\360se6\Application
     * 360se.exe.exe --remote-debugging-port=9222 --user-data-dir="D:\CODE\JAVA\webAuto\demo01\driver\chromeOptions_360_78"
     * @Author: 致心
     * @Date: 2020/9/7 9:16
     */
    private static void controlExistingBrowser360_78() {
        System.setProperty("webdriver.chrome.driver", "driver/chromedriver360_78.exe");
        ChromeOptions options = new ChromeOptions();
        options.setBinary("C:\\Users\\27451\\AppData\\Roaming\\secoresdk\\360se6\\Application\\360se.exe");
        options.setExperimentalOption("debuggerAddress", "localhost:9222");
        WebDriver driver = new ChromeDriver(options);
        System.out.println(driver.getTitle());
//        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")).sendKeys("vue 的使用");
//        driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input")).click();
    }


    /**
     * @Description 这里命令先执行
     * 对于-remote-debugging-port值，可以指定任何打开的端口。
     * 而在 options.setExperimentalOption("debuggerAddress", "localhost:9222");端口一定要对上
     * 对于-user-data-dir标记，指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome，不会污染你的默认配置文件。
     * cd C:\Program Files\Google\Chrome\Application
     * chrome.exe --remote-debugging-port=9222 --user-data-dir="D:\CODE\JAVA\webAuto\demo01\driver\chromeOptions"
     * @Author: 致心
     * @Date: 2020/9/4 10:09
     */
    private static void controlExistingBrowser() {
        System.setProperty("webdriver.chrome.driver", "driver/chromedriver98.0.4758.102.exe");
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress", "localhost:9222");
        WebDriver driver = new ChromeDriver(options);
        WebElement inputEle = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[1]/div[2]/div/div[1]/div/input"));
        WebElement searchEle = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[1]/div[2]/div/div[1]/div/span/span/div/div[3]"));
        WebElement resultEle = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[2]/div[1]/div[1]/div[1]/input"));
        WebElement cityEle = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[1]/div[3]/div/p"));
        WebElement citySelect = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[1]/div[3]/div/div/div[2]"));
        List<WebElement> provinceLists = citySelect.findElements(By.className("province-list"));
        List<CityPos> cityPos = readExcel();
        System.out.println("cityPos.size() = " + cityPos.size());
        int count = 0;
        String province = null;
        String city = null;
        boolean cityClick = false;
        for (CityPos i : cityPos) {
            System.out.println(i.get经销商名称() + (++count));
            if (StringUtils.isNotEmpty(i.get坐标值())) {
                continue;
            }
            System.out.println("i.get省份() = " + i.get省份());
            System.out.println("province = " + province);
            System.out.println(i.get城市());
            System.out.println("city = " + city);
            if (!StringUtils.equals(i.get城市(), city) || !StringUtils.equals(i.get省份(), province)) {
                if (!cityClick) {
                    cityEle.click();
                    cityClick = true;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                Optional<WebElement> first = provinceLists
                        .stream()
                        .filter(iitem -> {
                            String text = iitem.findElement(By.className("province-name")).getText();
                            return i.get省份().contains(text) || text.contains(i.get省份());
                        })
                        .findFirst();
                if (first.isPresent()) {
                    WebElement webElement = first.get();
                    Optional<WebElement> span = webElement.findElement(By.className("city-list"))
                            .findElements(By.className("city-name"))
                            .stream()
                            .map(item -> item.findElement(By.tagName("span")))
                            .filter(item -> i.get城市().contains(item.getText()))
                            .findFirst();
                    if (span.isPresent()) {
                        WebElement webElement1 = span.get();
                        String text = webElement1.getText();
                        System.out.println("城市: " + text);
                        if (StringUtils.isNotEmpty(text)) {
                            webElement1.click();
                        } else {
                            cityEle.click();
                            i.set坐标值("城市未找到");
                        }
                        cityClick = false;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        if(hotCityClick(driver,i.get城市())){
                            cityClick = false;
                        } else {
                            continue;
                        }
                    }
                } else {
                    if(hotCityClick(driver,i.get城市())){
                        cityClick = false;
                    } else {
                        continue;
                    }
                }
            }
            province = i.get省份();
            city = i.get城市();
            inputEle.clear();
            inputEle.sendKeys(i.get经销商名称());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            searchEle.click();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String value = resultEle.getAttribute("value");
            WebElement matchName = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[2]/div[1]/h2"));
            String text = matchName.getText();
            if (text.contains(i.get经销商名称()) || i.get经销商名称().contains(text)) {
                if (StringUtils.isNotEmpty(value)) {
                    i.set坐标值(value);
                } else {
                    i.set坐标值("未找到");
                }
            } else {
                i.set坐标值("未找到");
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            writeExcel(cityPos);
        }
    }

    private static boolean hotCityClick(WebDriver driver,String city) {
        AtomicBoolean isClick = new AtomicBoolean(false);
        WebElement element = driver.findElement(By.xpath("/html/body/div[1]/div/div[2]/div[1]/div[3]/div/div/ul[1]"));
        element.findElements(By.className("city-name"))
                .stream()
                .map(i->i.findElement(By.tagName("span")))
                .filter(i->i.getText().contains(city) || city.contains(i.getText()))
                .findFirst()
                .ifPresent(i->{
                    i.click();
                    isClick.set(true);
                });
        return isClick.get();
    }

    private static void writeExcel(List<CityPos> wriResult) {
        EasyExcel
                .write("D:\\window\\桌面\\test.xlsx")
                .head(CityPos.class)
                .sheet()
                .doWrite(wriResult);
    }

    private static List<CityPos> readExcel() {
        return EasyExcel
                .read("D:\\window\\桌面\\经销商坐标点收集表（腾讯地图）.xlsx")
                .head(CityPos.class)
                .sheet(0)
                .doReadSync();
    }

    /**
     * @Description
     * 操作步骤
     *
     * 1.找到本地安装的浏览器启动路径，例如Chrome
     *
     * # windows
     *     C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
     * # mac
     * 　　/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
     * 2.通过命令行启动ChromeDbug模式
     *
     * # windows
     * 　　$ C:\Program Files (x86)\Google\Chrome\Application>chrome.exe --remote-debugging-port=9222
     *
     * # mac
     * 　　$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome -remote-debugging-port=9222
     *
     * # 注：
     * 　　1. 启动浏览器dbug模式时需要把浏览器打开的进程先全部关闭。
     * 　　2. 9222是默认端口，可以随意修改。但别使用已经被占用的端口。
     * 3.连接调试开关打开的chrome
     *
     * System.setProperty("webdriver.chrome.driver", "D:\\drivers\\chromedriver.exe");
     * ChromeOptions options = new ChromeOptions();
     * options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
     * //        options.addArguments("proxy-server=http://10.11.11.11:1234");
     * //        options.addArguments("disable-notifications");
     * //        options.addArguments("disable-popup-blocking");
     * //        options.addArguments("disable-extensions");
     * //        options.addArguments("disable-infobars");
     * //        options.addArguments("start-maximized");
     * //        options.setPageLoadStrategy(PageLoadStrategy.NONE);
     *
     * WebDriver driver = new ChromeDriver(options);
     * System.out.println(driver.getTitle());
     *
     *
     * 附Chrom参数配置:
     *
     * 1 --allow-outdated-plugins 不停用过期的插件。
     * 2 --allow-running-insecure-content 默认情况下，https 页面不允许从 http 链接引用 javascript/css/plug-ins。添加这一参数会放行这些内容。
     * 3 --allow-scripting-gallery 允许拓展脚本在官方应用中心生效。默认情况下，出于安全因素考虑这些脚本都会被阻止。
     * 4 --disable-accelerated-video 停用 GPU 加速视频。
     * 5 --disable-dart 停用 Dart。
     * 6 --disable-desktop-notifications 禁用桌面通知，在 Windows 中桌面通知默认是启用的。
     * 7 --disable-extensions 禁用拓展。
     * 8 --disable-file-system 停用 FileSystem API。
     * 9 --disable-preconnect 停用 TCP/IP 预连接。
     * 10 --disable-remote-fonts 关闭远程字体支持。SVG 中字体不受此参数影响。
     * 11 --disable-speech-input 停用语音输入。
     * 12 --disable-web-security 不遵守同源策略。
     * 13 --disk-cache-dir 将缓存设置在给定的路径。
     * 14 --disk-cache-size 设置缓存大小上限，以字节为单位。
     * 15 --dns-prefetch-disable 停用DNS预读。
     * 16 --enable-print-preview 启用打印预览。
     * 17 --extensions-update-frequency 设定拓展自动更新频率，以秒为单位。
     * 18 --incognito 让浏览器直接以隐身模式启动。
     * 19 --keep-alive-for-test 最后一个标签关闭后仍保持浏览器进程。（某种意义上可以提高热启动速度，不过你最好得有充足的内存）
     * 20 --kiosk 启用kiosk模式。（一种类似于全屏的浏览模式）
     * 21 --lang 使用指定的语言。
     * 22 --no-displaying-insecure-content 默认情况下，https 页面允许从 http 链接引用图片/字体/框架。添加这一参数会阻止这些内容。
     * 23 --no-first-run 跳过 Chromium 首次运行检查。
     * 24 --no-referrers 不发送 Http-Referer 头。
     * 25 --no-sandbox 彻底停用沙箱。
     * 26 --no-startup-window 启动时不建立窗口。
     * 27 --proxy-pac-url 使用给定 URL 的 pac 代理脚本。（也可以使用本地文件，如 --proxy-pac-url=“file:\\c:\proxy.pac”）
     * 28 --proxy-server 使用给定的代理服务器，这个参数只对 http 和 https 有效。（例如 --proxy-server=127.0.0.1:8087 ）
     * 29 --single-process 以单进程模式运行 Chromium。（启动时浏览器会给出不安全警告）
     * 30 --start-maximized 启动时最大化。
     * 31 --user-agent 使用给定的 User-Agent 字符串
     *
     * 32 –user-data-dir=UserDataDir  自订使用者帐户资料夹（如：–user-data-dir=“D:\temp\Chrome User Data”）
     * 33 –process-per-tab  每个分页使用单独进程
     * 34 –process-per-site 每个站点使用单独进程
     * 35 –in-process-plugins 插件不启用单独进程
     *
     * 36 –disable-popup-blocking 禁用弹出拦截
     * 37 –disable-javascript 禁用JavaScript
     * 38 –disable-java 禁用Java
     * 39 –disable-plugins 禁用插件
     * 40 –disable-images 禁用图像
     * 41 –omnibox-popup-count=”num” 将网址列弹出的提示选单数量改为num个
     * 42 –enable-vertical-tabs 调整chrome游览器标签存放在左边，非顶部
     * 引用文章地址：https://blog.csdn.net/liang1352389/article/details/104392578
     * @Author: 致心
     * @Date: 2020/9/4 10:44
     */

}
